// ----------------------------------
// RSDK Project: Sonic 1/Sonic 2
// Script Description: Monitor Object
// Script Author: Christian Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

// Aliases
private alias 13 : TYPE_MONITOR
private alias saveRAM[399] : spindash.active	//63C SData.bin
private alias saveRAM[400] : peelout.active	//640 SData.bin
private alias saveRAM[401] : dropdash.active	//644 SData.bin
private alias saveRAM[402] : shilds.type	//648 SData.bin
private alias saveRAM[403] : music.type		//64C SData.bin
private alias saveRAM[404] : timer.type		//650 SData.bin
private alias saveRAM[405] : timeover.active	//654 SData.bin
private alias saveRAM[406] : flight.cancel	//658 SData.bin
private alias saveRAM[407] : region.type	//65C SData.bin
private alias saveRAM[408] : lives.amount	//660 SData.bin
private alias saveRAM[409] : tiger.active	//664 SData.bin

// Function declarations
reserve function Monitor_DebugDraw
reserve function Monitor_DebugSpawn

// Static Values
public value Monitor_value26 = 0;

// Tables
public table Monitor_table15
	1, 2, 3, 4, 5, 12, 13, 1, 2, 1
end table

public table Monitor_table14
	1, 2, 3, 4, 5, 9, 10, 11, 12, 13
end table


function Monitor_DebugDraw
	DrawSprite(0)
	temp0 = object[0].value17
	temp0 -= Monitor_value26
	if temp0 == 5
		temp0 += stage.playerListPos
	else
		if temp0 > 5
			temp0 += 2
		end if
	end if
	temp0 += 2
	DrawSprite(temp0)
end function


function Monitor_DebugSpawn
	temp0 = object[0].value17
	temp0 -= Monitor_value26
	if temp0 == 5
		temp0 += stage.playerListPos
	else
		if temp0 > 5
			temp0 += 2
		end if
	end if
	CreateTempObject(TypeName[Monitor], temp0, object.xpos, object.ypos)
	object[tempObjectPos].frame = object[tempObjectPos].propertyValue
	object[tempObjectPos].frame += 2
end function


event ObjectMain
	if object.state == 1
		object.yvel += 0x3800
		object.ypos += object.yvel
		if object.yvel >= 0
			ObjectTileCollision(CSIDE_FLOOR, 0, 16, 0)
			if checkResult == 1
				object.yvel = 0
				object.state = 0
			end if
		end if
	end if
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		CheckGreater(object[currentPlayer].yvel, -1)
		temp0 = checkResult
		CheckEqual(object[currentPlayer].gravity, GRAVITY_GROUND)
		temp0 |= checkResult
		if temp0 == 1
			CheckEqual(object[currentPlayer].animation, ANI_JUMPING)
			temp0 = checkResult
			CheckEqual(object[currentPlayer].animation, 48)
			temp0 |= checkResult
			CheckEqual(object[currentPlayer].animation, ANI_LEDGEPULLUP)
			temp0 |= checkResult
			if temp0 == 1
				if object[currentPlayer].value16 == 0
					BoxCollisionTest(C_TOUCH, object.entityPos, -16, -14, 16, 16, currentPlayer, object[currentPlayer].value40, object[currentPlayer].value38, object[currentPlayer].value41, object[currentPlayer].value39)
					if checkResult == 1
						object.state = 0
						CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)
						object[tempObjectPos].drawOrder = 4
						object[currentPlayer].yvel += object[currentPlayer].value25
						object[currentPlayer].yvel += object[currentPlayer].value25
						if object[currentPlayer].animation != 48
							FlipSign(object[currentPlayer].yvel)
						end if
						object.type = TypeName[Broken Monitor]
						object.value3 = currentPlayer
						if object.priority != PRIORITY_XBOUNDS_DESTROY
							object.priority = PRIORITY_ACTIVE
						end if
						object.alpha = 255
						object.value0 = object.ypos
						object.value1 = -0x30000
						if object.propertyValue == 14
							vs.randomValue *= 0x41C64E6D
							vs.randomValue += 0x3039
							vs.randomValue &= 0x7FFFFFFF
							temp0 = vs.randomValue
							temp0 >>= 16
							temp0 %= 10
							if options.vsMode == 1
								if object[currentPlayer].propertyValue == 0
									GetTableValue(object.propertyValue, temp0, Monitor_table14)
								else
									GetTableValue(object.propertyValue, temp0, Monitor_table15)
								end if
								if object.propertyValue == 13
									if object[0].controlMode == -1
										object.propertyValue = 2
									end if
									if object[1].controlMode == -1
										object.propertyValue = 2
									end if
									if object[0].state == PlayerObject_Blank
										object.propertyValue = 1
									end if
									if object[1].state == PlayerObject_Blank
										object.propertyValue = 1
									end if
								end if
							else
								if shilds.type == 0
									GetTableValue(object.propertyValue, temp0, Monitor_table14)
								else
									GetTableValue(object.propertyValue, temp0, Monitor_table15)
								end if
								if object.propertyValue == 13
									object.propertyValue = 1
								end if
							end if
						end if
						if options.vsMode == 1
							if vs.playerID == 0
								if currentPlayer == 0
									vs.items1P++
								else
									vs.items2P++
								end if
							else
								if currentPlayer == 1
									vs.items1P++
								else
									vs.items2P++
								end if
							end if
						end if
						PlaySfx(SfxName[Glass], 0)
						PlaySfx(SfxName[Destroy], 0)
					end if
				else
					BoxCollisionTest(C_BOX, object.entityPos, -15, -14, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				end if
			else
				BoxCollisionTest(C_BOX, object.entityPos, -15, -14, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
			end if
		else
			BoxCollisionTest(C_BOX, object.entityPos, -15, -16, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
			if checkResult == 4
				object.state = 1
				object.yvel = -0x20000
				object[currentPlayer].yvel = 0x20000
			end if
		end if
	next
end event


event ObjectDraw
	object.inkEffect = INK_ALPHA
	object.alpha = 120
	if stage.listpos == 19
		DrawSprite(20)
	else
		DrawSprite(0)
		DrawSpriteFX(19, FX_INK, object.xpos, object.ypos)
	end if
	
	switch StageSetup_monitorOverlayFrame
	case 0
	case 1
		break
	case 6
	case 7
		DrawSprite(1)
		break
	case 12
	case 13
		DrawSprite(2)
		break
	default
		DrawSprite(object.frame)
	end switch
end event


event ObjectStartup
	LoadSpriteSheet("Global/Items.gif")
	SpriteFrame(-16, -16, 32, 32, 18, 1)
	SpriteFrame(-8, -9, 16, 14, 18, 51)
	SpriteFrame(-8, -9, 16, 14, 35, 51)
	SpriteFrame(-8, -6, 16, 14, 18, 66) //ring icon
	SpriteFrame(-8, -6, 16, 14, 35, 66)
	SpriteFrame(-8, -6, 16, 14, 18, 81)
	SpriteFrame(-8, -6, 16, 14, 35, 81)
	SpriteFrame(-8, -6, 16, 14, 18, 96)
	SpriteFrame(-8, -6, 16, 14, 35, 96)
	SpriteFrame(-8, -6, 16, 14, 18, 111)
	SpriteFrame(-8, -6, 16, 14, 35, 111)
	SpriteFrame(-8, -6, 16, 14, 18, 141)
	SpriteFrame(-8, -6, 16, 14, 35, 126)
	SpriteFrame(-8, -6, 16, 14, 18, 126)
	SpriteFrame(-8, -6, 16, 14, 35, 141)
	SpriteFrame(-8, -6, 16, 14, 18, 156)
	SpriteFrame(-8, -6, 16, 14, 35, 156)
	SpriteFrame(-8, -6, 16, 14, 18, 171)
	SpriteFrame(-8, -6, 16, 14, 35, 171)
	SpriteFrame(-16, -16, 32, 32, 248, 1) // NEW

	SpriteFrame(-16, -16, 29, 34, 482, 477)
	temp0 = 0
	Monitor_value26 = DebugMode_ObjCount
	Monitor_value26--
	while temp0 < 16
		temp2 = 1
		if temp0 >= 4
			if temp0 <= 6
				temp1 = temp0
				temp1 -= 4
				if stage.playerListPos != temp1
					temp2 = 0
				end if
			end if
		end if
		if temp2 == 1
			SetTableValue(TypeName[Monitor], DebugMode_ObjCount, DebugMode_TypesTable)
			SetTableValue(Monitor_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
			SetTableValue(Monitor_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
			DebugMode_ObjCount++
		end if
		temp0++
	loop
	foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].value31 = object[arrayPos0].propertyValue
		object[arrayPos0].value31 >>= 4
		object[arrayPos0].propertyValue &= 15
	next
	if stage.playerListPos == 1
		foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
			if object[arrayPos0].propertyValue == 5
				object[arrayPos0].propertyValue = 6
			end if
		next
	end if
	if stage.playerListPos == 2
		foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
			if object[arrayPos0].propertyValue == 5
				object[arrayPos0].propertyValue = 7
			end if
		next
	end if
	if options.gameMode == 2
		foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
			if object[arrayPos0].propertyValue == 5
				object[arrayPos0].type = TypeName[Blank Object]
			end if
		next
	end if
	if options.vsMode == 1
		switch vs.itemMode
		case 1
			foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].propertyValue = 14
			next
			break
		case 2
			foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].propertyValue = 13
			next
			break
		end switch
	else
		if options.shieldType > 1
			foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].propertyValue = 14
			next
		else
			if options.shieldType == 0
				foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
					if object[arrayPos0].propertyValue >= 9
						if object[arrayPos0].propertyValue <= 11
							if object[arrayPos0].value31 == 0
								object[arrayPos0].type = TypeName[Blank Object]
							else
								object[arrayPos0].propertyValue = object[arrayPos0].value31
							end if
						end if
					end if
				next
			end if
		end if
	end if
	foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].frame = object[arrayPos0].propertyValue
		object[arrayPos0].frame += 2
	next
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 1, 143)
end event
